<?php
/**
 * Всякие полезняхи
 *
 * @author Vogel
 */
class Utils {
  /*
   * Возвращает текущее время в формате [секудны.минкросекунды]
   */
  public static $error_type = array (
          E_ERROR              => 'ERROR',
          E_WARNING            => 'WARNING',
          E_PARSE              => 'PARSING ERROR',
          E_NOTICE             => 'NOTICE',
          E_CORE_ERROR         => 'CORE ERROR',
          E_CORE_WARNING       => 'CORE WARNING',
          E_COMPILE_ERROR      => 'COMPILE ERROR',
          E_COMPILE_WARNING    => 'COMPILE WARNING',
          E_USER_ERROR         => 'USER ERROR',
          E_USER_WARNING       => 'USER WARNING',
          E_USER_NOTICE        => 'USER NOTICE',
          E_STRICT             => 'STRICT NOTICE',
          E_RECOVERABLE_ERROR  => 'RECOVERABLE ERROR');
  
  public static function microtime() {
    $time = explode(' ',  microtime());
    return ($time[1] + $time[0]);
  }

  public static function describe_argument($arg) {
    switch (strtolower(gettype($arg))) {
      case 'string':
        return( '"'.str_replace( array("\n"), array(''), $arg ).'"' );
      case 'boolean':
        return (bool)$arg;
      case 'object':
        return 'object('.get_class($arg).')';
      case 'array':
        $ret = 'array(';
        $separtor = '';
        foreach ($arg as $k => $v) {
          if ($k == 'GLOBALS') continue;
          $ret .= $separtor.$k.' => '.var_export($v, true);
          //$ret .= $separtor.self::describe_argument($k).' => '.self::describe_argument($v);
          $separtor = ', ';
        }
        $ret .= ')';
        return $ret;
      case 'resource':
        return 'resource('.get_resource_type($arg).')';
      default:
        return var_export($arg, true);
    }
  }
  
  public static function backtrace($backtrace = null) {
    if (!isset($backtrace)) $backtrace = array_reverse(debug_backtrace());
    $result = array();
    foreach ($backtrace as $line => $data) {
      // Пропускаем служебные функции и себя
      if ($line >= count($backtrace)-1) continue;
      if ($data['function'] == 'trigger_error') continue;
      // Найдём где...
      if (isset($data['class'])) {
        $current_method = $data['class'].$data['type'].$data['function'];
      } else {
        $current_method = $data['function'];
      }
      // ...перечислим аргументы...
      $method_args = '';
      if (!empty($data['args'])) {
        $separator = '';
        foreach($data['args'] as $arg ) {
            $method_args .= "$separator".self::describe_argument($arg);
            $separator = ', ';
          }
      }
      // ...зафиксируем позицию...
      $current_position = $data['file']." on line [".$data['line']."]";
      // ... и отдадим результат
      $result[] = "[$line] in ".$current_method."(".$method_args.") <-- ".$current_position;
    }
    return $result;
  }

  public static function custom_error_handler($errno, $errstr, $errfile, $errline, $context) {
    // bubble up errors we don't want to handle
    if ($errno == E_NOTICE || 
        /*$errno == E_USER_NOTICE || */
        $errno == E_STRICT) return false;
    // check if function has been called by an exception
    if(func_num_args() == 5) {
      // called by trigger_error()
      $exception = null;
      list($errno, $errstr, $errfile, $errline) = func_get_args();
      $backtrace = array_reverse(debug_backtrace());
    } else {
      // caught exception
      $exc = func_get_arg(0);
      $errno = $exc->getCode();
      $errstr = $exc->getMessage();
      $errfile = $exc->getFile();
      $errline = $exc->getLine();
      $backtrace = $exc->getTrace();
    }
    // create error message
    if (array_key_exists($errno, self::$error_type)) {
      $err = self::$error_type[$errno];
    } else {
      $err = 'CAUGHT EXCEPTION';
    }

    // backtrace
    $result_backtrace = self::backtrace($backtrace);
/*    
    // Log error to standard apache error log
    error_log("~~~~~[".date("Y.m.d H:i:s")."]~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 0);
    error_log("$err: " . strip_tags($errstr), 0);
    error_log("In " . $errfile . " on line $errline", 0);
    error_log("STACK TRACE", 0);
    foreach($result_backtrace as $v) error_log("  ". preg_replace("/\s\s+/", " ", $v), 0);

    // variables in local scope
    if (count($context) > 0) {
      $result_context = array();
    foreach ($context as $line => $data) {
      $result_context[$line] = self::describe_argument($data);
    }
      if (count($result_context) > 0) {
    error_log("VARIABLES IN LOCAL SCOPE ", 0);
    foreach($result_context as $a=> $v) error_log("  $".$a." = ".$v, 0);
      }
    }
    error_log("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 0);
*/
    if (DEBUG_ERRORS_TO_FILE) {
      // Распишем все прелести в файле
      // log error to custom file
      $log = new Log('php_errors', CFG_PATH_LOG);
      $log->message("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
      $log->message("$err: " . strip_tags($errstr));
      $log->message("In " . $errfile . " on line $errline");
      $log->message("STACK TRACE");
      foreach($result_backtrace as $v) {
        $log->message("  ". preg_replace("/\s\s+/", " ", $v));
      }

      // variables in local scope
      if (count($context) > 0) {
        $result_context = array();
        foreach ($context as $line => $data) {
          $result_context[$line] = self::describe_argument($data);
        }
        if (count($result_context) > 0) {
          $log->message("VARIABLES IN LOCAL SCOPE ");
          foreach($result_context as $a=> $v) {
            $log->message("  $".$a." = ".$v);
          }
        }
      }
      $log->message("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~");
    } else {
      // Вывалим наше говнецо на почту несчастному
      // Log error to mail
      $message = '';
      $message .= "$err: " . strip_tags($errstr)."\r\n";
      $message .= "In " . $errfile . " on line $errline\r\n";
      $message .= "STACK TRACE\r\n";
      foreach($result_backtrace as $v) {
        $message .= "  ". preg_replace("/\s\s+/", " ", $v)."\r\n";
      }

      // variables in local scope
      if (count($context) > 0) {
        $result_context = array();
        foreach ($context as $line => $data) {
          $result_context[$line] = self::describe_argument($data);
        }
        if (count($result_context) > 0) {
          $message .= "VARIABLES IN LOCAL SCOPE \r\n";
          foreach($result_context as $a=> $v) {
            $message .= "  $".$a." = ".$v."\r\n";
          }
        }
      }
      // $log->message("~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~", 0);
      // Отправим письмецо
      $mail_subject = "SQ-".$_SERVER['STATE']."-BUG : " . $errstr;
      // mail('sqbugs@gmail.com', $mail_subject, $message);
    }
    /* Don't execute PHP internal error handler */
    return true;
  }    	

  public static function sendMail($mailhost, $to, $subject, $message, $headers, $auth_login='', $auth_password='') {
		// get From address
		if ( preg_match("/From:.*?[A-Za-z0-9\._%-]+\@[A-Za-z0-9\._%-]+.*/", $headers, $froms) ) {
		    preg_match("/[A-Za-z0-9\._%-]+\@[A-Za-z0-9\._%-]+/", $froms[0], $fromarr);
		    $from = $fromarr[0];
		}
		// Open an SMTP connection
		$cp = fsockopen ($mailhost, 25, $errno, $errstr, 1);
		if (!$cp)
		 return "Failed to even make a connection to ".$mailhost.":25 (".$errno.")-".$errstr;
		$res=fgets($cp,256);
		if(substr($res,0,3) != "220") return "Failed to connect ($res)";

		// Say hello...
		fputs($cp, "HELO ".$mailhost."\r\n");
		$res=fgets($cp,256);
		if(substr($res,0,3) != "250") return "Failed to Introduce ($res)";

		// perform authentication
		fputs($cp, "auth login\r\n");
		$res=fgets($cp,256);
		if(substr($res,0,3) != "334") return "Failed to Initiate Authentication ($res)";
		
		fputs($cp, base64_encode($auth_login)."\r\n");
		$res=fgets($cp,256);
		if(substr($res,0,3) != "334") return "Failed to Provide Username for Authentication ($res)";
		
		fputs($cp, base64_encode($auth_password)."\r\n");
		$res=fgets($cp,256);
		if(substr($res,0,3) != "235") return "Failed to Authenticate ($res)";

		// Mail from...
		fputs($cp, "MAIL FROM: <$from>\r\n");
		$res=fgets($cp,256);
		if(substr($res,0,3) != "250") return "MAIL FROM failed ($res)";

		// Rcpt to...
		fputs($cp, "RCPT TO: <$to>\r\n");
		$res=fgets($cp,256);
		if(substr($res,0,3) != "250") return "RCPT TO failed ($res)";

		// Data...
		fputs($cp, "DATA\r\n");
		$res=fgets($cp,256);
		if(substr($res,0,3) != "354") return "DATA failed ($res)";

		// Send To:, From:, Subject:, other headers, blank line, message, and finish
		// with a period on its own line (for end of message)
		fputs($cp, "To: $to\r\nFrom: $from\r\nSubject: $subject\r\n$headers\r\n\r\n$message\r\n.\r\n");
		$res=fgets($cp,256);
		if(substr($res,0,3) != "250") return "Message Body Failed ($res)";

		// ...And time to quit...
		fputs($cp,"QUIT\r\n");
		$res=fgets($cp,256);
		if(substr($res,0,3) != "221") return "QUIT failed ($res)";

		return '';
	}

	public static function run_process($cmd) {
	  if (!preg_match("/^win*/", strtolower(PHP_OS))) {
  		pclose(popen($cmd, "r"));
		} else {
			// windows
  		pclose(popen("start ".$cmd, "r"));
		} 
	}
	
	public static function js_redirect($to_url) {
		header("Location: $to_url");
		#echo('<script language="javascript">window.location.href="'.$to_url.'";</script>');
		die();
	}
	
	public static function get_server_time() {
		$a = DB::fetch(DB::query("select unix_timestamp() as time from dual"));
		return $a['time'];
	}
	
	public static function sign_array($target, $secret, $sorted = true) {
	  $args = array();
	  foreach ($target as $k => $v) {
	    $args[] = array('name' => $k, 'value' => $v);
	  }
	  if ($sorted) 
	  	sort($args);
	  	
	  $sigStr = '';
	  foreach($args as $p)
	    $sigStr .= join('=',$p);
	  return md5($sigStr . $secret);
	}
	
/*UPDATED MANFREDI*/
	public static function _objectToArray($par){
		if(is_array($par) || is_object($par)){
			foreach($par as $k => $v){
				if(is_object($v)){
					$n[$k]=self::_objectToArray($v);
				}else if(is_array($v)){
					$n[$k]=self::_objectToArray($v);
				}else {
					$n[$k]=$v;
				}
			}
			return $n;
		}else{
			return $par;
		}

	}
	public static function json_fix_cyr($json_str) {
		$cyr_chars = array (
		'\u0430' => 'а', '\u0410' => 'А',
		'\u0431' => 'б', '\u0411' => 'Б',
		'\u0432' => 'в', '\u0412' => 'В',
		'\u0433' => 'г', '\u0413' => 'Г',
		'\u0434' => 'д', '\u0414' => 'Д',
		'\u0435' => 'е', '\u0415' => 'Е',
		'\u0451' => 'ё', '\u0401' => 'Ё',
		'\u0436' => 'ж', '\u0416' => 'Ж',
		'\u0437' => 'з', '\u0417' => 'З',
		'\u0438' => 'и', '\u0418' => 'И',
		'\u0439' => 'й', '\u0419' => 'Й',
		'\u043a' => 'к', '\u041a' => 'К',
		'\u043b' => 'л', '\u041b' => 'Л',
		'\u043c' => 'м', '\u041c' => 'М',
		'\u043d' => 'н', '\u041d' => 'Н',
		'\u043e' => 'о', '\u041e' => 'О',
		'\u043f' => 'п', '\u041f' => 'П',
		'\u0440' => 'р', '\u0420' => 'Р',
		'\u0441' => 'с', '\u0421' => 'С',
		'\u0442' => 'т', '\u0422' => 'Т',
		'\u0443' => 'у', '\u0423' => 'У',
		'\u0444' => 'ф', '\u0424' => 'Ф',
		'\u0445' => 'х', '\u0425' => 'Х',
		'\u0446' => 'ц', '\u0426' => 'Ц',
		'\u0447' => 'ч', '\u0427' => 'Ч',
		'\u0448' => 'ш', '\u0428' => 'Ш',
		'\u0449' => 'щ', '\u0429' => 'Щ',
		'\u044a' => 'ъ', '\u042a' => 'Ъ',
		'\u044b' => 'ы', '\u042b' => 'Ы',
		'\u044c' => 'ь', '\u042c' => 'Ь',
		'\u044d' => 'э', '\u042d' => 'Э',
		'\u044e' => 'ю', '\u042e' => 'Ю',
		'\u044f' => 'я', '\u042f' => 'Я',

		'\r' => '',
		'\n' => '',
		'\t' => ''
		);

		foreach ($cyr_chars as $cyr_char_key => $cyr_char) {
			$json_str = str_replace($cyr_char_key, $cyr_char, $json_str);
		}
		return $json_str;
	}
	public static function UpdateSmiles($s)
	{

			$forum_smile = Array('wacko','unknw','vava','unsure','wacko2','yahoo','yes','acute','aggressive','air_kiss','angel','beee','biggrin','wink','biggrin2','blum','blush','bo','bomb','boredom','chok','clapping','cray','cray2','crazy','bye','dance','dash','diablo','dirol','drink','fool','fool2','good','greeting','drink2','happy','heart','help','kiss','kiss3','laugh','laugh2','lol','lol2','mad','mail1','man_in_love','ok','mocking','music','mamba','music2','new_russian','pardon','nea','rofl','rolleyes','rose','sad','sad2','scratch_one-s_head','secret','shout','smile','smile2','sorry','stop');
			$out=$s;
			foreach ($forum_smile as $key) {
				$out = preg_replace("/:$key:/","<img src='http://avangardonline.ru/i/smiles/$key.gif'> ", $out);
			}


			return $out;



	}
	
	public static function RemoveBBcode($s){
		$faBBcodes=array(
		"/\[red\]/",
		"/\[\/font\]/",
		"/\[b\]/",
		"/\[\/b\]/",
		"/\[i\]/",
		"/\[\/i\]/",
		"/\[u\]/",
		"/\[\/u\]/",
		"/\[quote\]/",
		"/\[\/quote\]/",
		"/\n/",
		"#\[img\](.*?)\[\/img\]#si",
		"#\[img align=(.*?)\](.*?)\[/img\]#si",
		"#\[img align=(.*?) style=(.*?)\](.*?)\[/img\]#si",
		"/(\[a\])(.*?)(\[\/a\])/",
		"#\[a\](.*?)\[/a\]#si",
		"#\[a linkes=([a-z]+?://){1}(.*?)\](.*?)\[/a\]#si",
		"#\[a=(.*?)\](.*?)\[/a\]#si",
		"#\[email\](.*?)\[/email\]#si"
		);

		$faBBUNcodes=array(
		"","","","","",	"",	"",	"",	"",	"",	"",	"",	"",	"",	"",	'',	'',	'',	''
		);

		$s=preg_replace($faBBcodes,$faBBUNcodes,$s);
		return $s;
	}
	
	public static function CutText($text, $count)
	{
		mb_internal_encoding("UTF-8");
		$cnt=$count;
		$pub_text=self::RemoveBBcode($text);
		if(mb_strlen($pub_text)>$count){
			$stop=0;
			while($stop!=1){
				$s=mb_substr($pub_text,$count-1,1);
				//echo "$s-----";
				if($s==" " or $cnt+5==$count){
					$stop=1;
				}else{
					$count++;
				}
			}
			$s=mb_substr($pub_text,0,$count);
		}else{
			return $pub_text;
		}

        return   $s;
	}
	
	public static function faBBcode($s){

			$faBBcodes=array(
				"/\[red\]/",
				"/\[\/font\]/",
				"/\[b\]/",
				"/\[\/b\]/",
				"/\[i\]/",
				"/\[\/i\]/",
				"/\[u\]/",
				"/\[\/u\]/",
				"/\[quote\]/",
				"/\[\/quote\]/",
				"/\n/",
				"#\[img\](.*?)\[\/img\]#si",
				"#\[img align=(.*?)\](.*?)\[/img\]#si",
				"#\[img align=(.*?) style=(.*?)\](.*?)\[/img\]#si",
				"/(\[a\])(.*?)(\[\/a\])/",
				"#\[a\](.*?)\[/a\]#si",
				"#\[a linkes=([a-z]+?://){1}(.*?)\](.*?)\[/a\]#si",
				"#\[a=(.*?)\](.*?)\[/a\]#si",
				"#\[email\](.*?)\[/email\]#si"
				);

					$faBBUNcodes=array(
					"<font color='red'>",
					"</font>",
					"<b>",
					"</b>",
					"<i>",
					"</i>",
					"<u>",
					"</u>",
										"<br><small><b>Цитата:</b></small><fieldset>",
					"</fieldset>",
					"<br>",
					"<img src='$1' align='center' style='max-width:400px'/>",
					"<img src=\"$2\" align='$1' style='max-width:400px'>",
					"<img src=\"$3\" align='$1' style='$2'>",
					"<a href=\"$2\" target=_blank>$2</a>",
                    '<a HREF="http://\1" TARGET="_blank">\1</a>',
                    '<a HREF="\1\2" TARGET="_blank">\3</a>',
                    '<a HREF="http://\1" TARGET="_blank">\2</a>',
                    '<A HREF="mailto:\1">\1</A>'
				);

				$s=preg_replace($faBBcodes,$faBBUNcodes,$s);

				return $s;
	}
	
	public static function checkNickName($nick, $bDebug = false){
		$rusAccSymbRe = 'ЙЦУКЕНГШЩЗХЪФЫВАПРОЛДЖЭЯЧСМИТЬБЮЁйцукенгшщзхъфывапролджэячсмитьбюё _\-';
		$latAccSymbRe = 'A-Za-z0-9';
		$rusNotRe = '/[^' . $rusAccSymbRe . ']+/';
		$latNotRe = '/[^' . $latAccSymbRe . ' _\-]+/';

		if(preg_match('/['.$latAccSymbRe.']/i', $nick)){
			if($bDebug) echo "Found latin<br>\n";
			if(preg_match($latNotRe, $nick)){
				return false;
			}else{
				return true;
			}

		}else{
			if($bDebug) echo "Not Found latin<br>\n";
			if($rec = preg_match($rusNotRe, $nick)){
				return false;
			}else{
				return true;
			}
		}
	}
	
	/*
		Входящие данные
		$inputSet = Array()
			[dataToPage] = Количество записей на страницу. (по умолчанию 10)
			[dataCount]	 = Общее количество записей
			[strNow]	 = Запись на которой сейчас.

		Исходящие данные
		$outputData	= Array();
			[lfrom]		= С какой записи начинать
			[limit]		= Количество записей на страницу.
			[maxPage]	= Последняя страница
			[arrPage]	= Array();
				[0]	Array(
					[p]	= номер записи с каторой начинать считку
					[c] = номер страницы
					[s]	= На этой ли мы странице находимся. (0 или 1)
				[1] Array()
	*/
	public static function dataOnPage($inputSet){
		if ($inputSet['dataToPage']==0 || $inputSet['dataToPage']==""){
			$inputSet['dataToPage']=10;
		}
		if ($inputSet['strNow'] == "" || $inputSet['dataToPage']=="0"){
			$inputSet['strNow'] = 0;
		}
		$outputData	= Array();
		$outputData['limit'] = $inputSet['dataToPage'];
		$outputData['lfrom'] = $inputSet['strNow'];


		if ($inputSet['dataCount']>$inputSet['dataToPage']){

			$outputData['arrPage'] = Array();

			$c=0;
			//Определяем начальную точку ... :)
			// Путем вычитания из текущей точки доступа количество записей на страницу умноженное на количество страниц до текущей страницы.
			$i_from=$inputSet['strNow']-($inputSet['dataToPage'] * 5);
			// если число отрицательное то устанавливаем его на 0, значит мы не отошли от первой страницы .
			if ($i_from<0){
				$i_from=0;
			}
			$c=$i_from / $inputSet['dataToPage'];

			for($i=$i_from;($i<($i_from+($inputSet['dataToPage'] * 11))) && ($i<=$inputSet['dataCount']-1);$i+=$inputSet['dataToPage']){
				#echo "Work";
				array_push($outputData['arrPage'],array("p"=>$i,"c"=>++$c,"s"=>(($i==$inputSet['strNow'])?"1":"0")));
			}
			$ostatok = $inputSet['dataCount'] % $inputSet['dataToPage'];

			$outputData['maxPage'] = ($ostatok==0) ? $inputSet['dataCount'] - $inputSet['dataToPage'] : $inputSet['dataCount'] - $ostatok;

		}
		return $outputData;
	}
	
	
	
	public static function imprintLogo($src,$logo_name,$logo_q){
		$imgNew=imagecreatefromgif($logo_name);
		imagecopymerge($src, $imgNew, imagesx($src)-imagesx($imgNew)-10, imagesy($src)-imagesy($imgNew)-10, 0, 0, imagesx($imgNew), imagesy($imgNew), $logo_q);
		return $src;
	}
	
	
	public static function img_resize($G_Settings,$src, $dest, $width, $height, $logo_q=100, $rgb=0xFFFFFF, $quality=100)
	{
	  if (!file_exists($src)){
		 echo "Не могу загрузить файл";
		 return false;
	  }
	  $size = getimagesize($src);
	  if ($size === false){
		echo "Проблема с размеров";
		return false;
	  }
	  // Определяем исходный формат по MIME-информации, предоставленной
	  // функцией getimagesize, и выбираем соответствующую формату
	  // imagecreatefrom-функцию.
	  $format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
	  $icfunc = "imagecreatefrom" . $format;
	  if (!function_exists($icfunc)) return false;
	  $x_ratio = $width / $size[0];
	  $y_ratio = $height / $size[1];
	  $ratio       = min($x_ratio, $y_ratio);
	  $use_x_ratio = ($x_ratio == $ratio);
	  $new_width   = $use_x_ratio  ? $width  : floor($size[0] * $ratio);
	  $new_height  = !$use_x_ratio ? $height : floor($size[1] * $ratio);
	  $new_left    = $use_x_ratio  ? 0 : floor(($width - $new_width) / 2);
	  $new_top     = !$use_x_ratio ? 0 : floor(($height - $new_height) / 2);
	  $isrc = $icfunc($src);
	  $idest = imagecreatetruecolor($width, $height);
	  imagefill($idest, 0, 0, $rgb);
	  imagecopyresampled($idest, $isrc, $new_left, $new_top, 0, 0, $new_width, $new_height, $size[0], $size[1]);

	  if($G_Settings["PRINT_LOGO"]==true && $width > 200){
	  	$idest= self::imprintLogo( $idest, $G_Settings["LOGO_NAME"], $logo_q);
	  }
	  imagejpeg($idest, $dest, $quality);
	  imagedestroy($isrc);
	  imagedestroy($idest);
	  return true;
	}







		/*
		Загрузка изображения на сервер.
		$formName - имя формы с изображением.
		$G_Settings - Array():
		$G_Settings["PRINT_LOGO"]		=  Печатать ли ЛОГО (true/false).
		$G_Settings["IMAGE_RESIZE"]		=  У меньшать ли картинки (true/false)
		$G_Settings["LOGO_NAME"]		=  Название картинки логотипа. (Только GIF и лежать должна в корне)
		$G_Settings["RESIZE_WIDTH"]		=  Ширина Фото под которую подгоняется маленькая фотка (если есть уменьшение).
		$G_Settings["RESIZE_B_WIDTH"]	=  Ширина под которую подгоняется большая фотка (если есть уменьшение)
		$G_Settings["DIR_IMG"]	   		=  Папка куда складывать большие картинки
		$G_Settings["DIR_IMG_SMALL"]	=  Папка куда складывать маленькие картинки (с перфиксом small_)
		$G_Settings["IMG_NAMES"]		=  Название будующей картинки.jpg
	*/

	public static function indexSmall($arr){
	/*
		$arr = Array();
			new_width = Новая ширина ресайза.
			file_patch = Путь до файла.
	*/
		$size = getimagesize($arr['file_patch']);
		//Вычисляем индекс уменьшения.
		if($size[0] > $arr['new_width']){
			$indef=$size[0]/$arr['new_width'];
			$return['width'] =$size[0]/$indef;
			$return['height']=$size[1]/$indef;
			if($return['width'] > $return['height'] && $arr['new_width'] < 100){
				$indef = $size[1] / $arr['new_width'];
				$return['width'] =$size[0]/$indef;
				$return['height']=$size[1]/$indef;
			}
		}else{
			$return['width'] =$size[0];
			$return['height']=$size[1];
		}
		return $return;
	}

	public static function uploadImage( $formName, $G_Settings ){
		if($_FILES[$formName]['error']==0){
			if (is_uploaded_file($_FILES[$formName]['tmp_name'])) {
				if (preg_match("/(.*)(.gif|.png|.jpg|jpeg)/i",$_FILES[$formName]['name'])) {
					$size = getimagesize($_FILES[$formName]['tmp_name']);
					$format = strtolower(substr($size['mime'], strpos($size['mime'], '/')+1));
					if (move_uploaded_file($_FILES[$formName]['tmp_name'], $G_Settings["DIR_IMG"]."/{$G_Settings["IMG_NAMES"]}.{$format}")) {
						// Присваиваем картинке необходимый CHMOD
						@chmod($G_Settings["DIR_IMG"]."/".$G_Settings["IMG_NAMES"],0777);
						if($G_Settings["IMAGE_RESIZE"]==true && $G_Settings["RESIZE_WIDTH"]!=""){
							$arr['new_width'] = $G_Settings["RESIZE_WIDTH"];
							$arr['file_patch']= "{$G_Settings["DIR_IMG"]}/{$G_Settings["IMG_NAMES"]}.$format";
							$resize = utils::indexSmall($arr);
							utils::img_resize($G_Settings,$G_Settings["DIR_IMG"]."/{$G_Settings["IMG_NAMES"]}.$format", $G_Settings["DIR_IMG_SMALL"]."/{$G_Settings["IMG_NAMES"]}.$format", $resize['width'], $resize['height']);
						}
						if($G_Settings["IMAGE_RESIZE"]==true && $G_Settings["RESIZE_B_WIDTH"]!=""){
							$arr['new_width'] = $G_Settings["RESIZE_B_WIDTH"];
							$arr['file_patch']= "{$G_Settings["DIR_IMG"]}/{$G_Settings["IMG_NAMES"]}.$format";
							$resize=utils::indexSmall($arr);
							utils::img_resize($G_Settings,$G_Settings["DIR_IMG"]."/{$G_Settings["IMG_NAMES"]}.$format", "{$G_Settings["DIR_IMG"]}/{$G_Settings["IMG_NAMES"]}.$format", $resize['width'], $resize['height']);
						}
						$return['done']	  = true;
						$return['file_name'] = $G_Settings["IMG_NAMES"].".".$format;
					}else{
						$return['ERRORS'] = "Ошибка закачки";
						$return['done']	  = false;
					}
				} else {
					$return['ERRORS'] = "Допустимы только .gif, .jpg, .jpeg и .png файлы! ";
					$return['done']	  = false;
				}
			}else{
				$return['ERRORS'] = "Ошибка закачки файла, проверьте размер фотографии.";
				$return['done']	  = false;
			}
		}else{
			if($_FILES[$formName]['error']==1){
				$return['ERRORS'] = "Размер принятого файла превысил максимально допустимый размер 1 МБ.";
				$return['done']	  = false;
			}
			if($_FILES[$formName]['error']==2){
				$return['ERRORS'] = "Размер загружаемого файла превысил значение MAX_FILE_SIZE, указанное в HTML-форме";
				$return['done']	  = false;
			}
			if($_FILES[$formName]['error']==3){
				$return['ERRORS'] = "Загружаемый файл был получен только частично";
				$return['done']	  = false;
			}
			if($_FILES[$formName]['error']==4){
				$return['ERRORS'] = "Файл не был загружен";
				$return['done']	  = false;
			}
		}
		return $return;

	}
	
	public static function secToTime($sec){
      $a = array(
        86400 => 'дн.', // количество секунд в сутках
        3600  => 'ч.', // количество секунд в часе
        60    => 'мин.', // количество секунд в минуте
        1     => 'сек.' // количество секунд в секунде
       );
       $out = '';
       foreach ($a as $k=>$v) {
          $tmp = floor($sec/$k);
          $out .=($tmp!="")? $tmp." ".$v.' ':'';
          $sec -= $tmp*$k;
       }
       return $out;
    }
    
	public static function replaceAllMess($s){
		mb_internal_encoding("UTF-8");
		$s = trim($s);
	# Удаляем HTML теги
	    $s = strip_tags( $s );
	# Разбиваем слова длиннее 30 символов пробелом	    
	    $arr=mb_split(' ',$s);//пробелами
		$arr2=array();
		foreach($arr as $str) {
		  if( mb_strlen($str) > 30 ) {
		     while(mb_strlen($str) > 30 ) {
		     	$arr2[]=mb_substr($str, 0, 30 ); 
		     	$str=mb_substr($str, 30);
		     }
		     if($str!=''){
		     	$arr2[]=$str;
		     } 
		  } else $arr2[]=$str;
		}
		$s=implode(' ',$arr2);
		return $s;
	}
	/**
	* Отправить личное сообщение пользователю.
	* А также меняет счетчики сообщений у юзера
	* @param ava_users $to - Адресат
	* @param mixed $title - Заголовок
	* @param mixed $body - Сообщение
	* @param ava_users $author - Автор сообщения если NULL то системное
	* 
	* @return $message_id (Если указан авторо то возвращает outbox message_id);
	*/
	public static function sendMessage(ava_users $to, $title, $body, $author = null){
		$inbox = new ava_user_message_box(true);
		$inbox->user_id = $to->id;
		$inbox->box = $box;
		$inbox->postdate = time();
		$inbox->title = $title;
		$inbox->body = $body;
		$inbox->read = 0;
		$inbox->author_id = ($author instanceof ava_users)? $author->id : 0;
		$inbox->save();
		$to->message->cnt_inbox+=1;
		$to->message->cnt_noread+=1;
		/*if($to->origin > 0){
			$to->api->setCounter($to->uid, $to->message->cnt_noread);
		}*/
		$to->message->save();
		if($author instanceof ava_users){
			$outbox = new ava_user_message_box(true);
			$outbox->user_id = $author->id;
			$outbox->box = "outbox";
			$outbox->postdate = time();
			$outbox->title = $title;
			$outbox->body = $body;
			$outbox->read = 1;
			$outbox->author_id = $to->id;
			$outbox->save();
			
			$author->message->cnt_outbox+=1;
			$author->message->save();
			// return $outbox->id;
		}
		return $inbox;
	}
	
	private static $command = null;	
	public static function getCommand($id, $requery = false)
	{
		if ((self::$command != null) && ($requery == false))
		{
			return self::$command;
		}
		else
		{
			$command = worker::fetchObject(ava_instance_dm_command, array("id" => $id));
			self::$command = $command;
			return $command;
		}
	}
	
}
?>
